import { configureStore } from '@reduxjs/toolkit'
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage'
import { combineReducers } from '@reduxjs/toolkit'
import authSlice from '@/store/slices/authSlice'
import userSlice from '@/store/slices/userSlice'
import menuSlice from '@/store/slices/menuSlice'
import permissionSlice from '@/store/slices/permissionSlice'
import themeSlice from '@/store/slices/themeSlice'
import { PERSIST_KEYS } from '@/constants/storage'
import adaptiveStorage from '@/utils/customStorage'

/**
 * 自定义序列化函数 - 优化存储格式，减少转义字符
 */
const customSerialize = (state: any) => {
  try {
    return JSON.stringify(state, null, 0) // 不使用缩进，但避免双重转义
  } catch (error) {
    console.warn('序列化失败，使用默认方式:', error)
    return JSON.stringify(state)
  }
}

/**
 * 自定义反序列化函数
 */
const customDeserialize = (serializedState: string) => {
  try {
    return JSON.parse(serializedState)
  } catch (error) {
    console.warn('反序列化失败:', error)
    return undefined
  }
}

/**
 * 菜单状态持久化配置
 * 只持久化标签页相关的状态，使用优化的存储引擎
 */
const menuPersistConfig = {
  key: PERSIST_KEYS.MENU,
  storage: adaptiveStorage, // 使用自定义存储引擎
  // 只持久化标签页相关字段
  whitelist: ['tagList', 'tag'],
  // 不持久化的字段
  blacklist: ['menuList', 'loading', 'error', 'breadcrumbList', 'searchValue', 'searchVisible', 'selectedKeys', 'openKeys'],
  // 使用自定义序列化函数（作为备选）
  serialize: customSerialize,
  deserialize: customDeserialize
}

/**
 * Redux Persist 根配置
 * 配置需要持久化的状态，使用优化的存储引擎
 */
const persistConfig = {
  key: PERSIST_KEYS.ROOT,
  storage: adaptiveStorage, // 使用自定义存储引擎
  // 持久化认证和主题状态
  whitelist: ['auth', 'theme'],
  // 黑名单：不持久化的状态字段
  blacklist: [],
  // 使用自定义序列化函数（作为备选）
  serialize: customSerialize,
  deserialize: customDeserialize
}

/**
 * 创建持久化的菜单reducer
 */
const persistedMenuReducer = persistReducer(menuPersistConfig, menuSlice)

/**
 * 合并所有reducers
 */
const rootReducer = combineReducers({
  auth: authSlice,                    // 认证状态管理
  user: userSlice,                    // 用户管理状态
  menu: persistedMenuReducer,         // 菜单和导航状态（支持持久化）
  permission: permissionSlice,        // 权限管理状态
  theme: themeSlice,                  // 主题配置状态
})

/**
 * 创建持久化的reducer
 */
const persistedReducer = persistReducer(persistConfig, rootReducer)

/**
 * Redux Store 配置
 * 集中管理应用的所有状态，并支持状态持久化
 */
export const store = configureStore({
  reducer: persistedReducer,
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({
      serializableCheck: {
        // 忽略持久化相关的 action，避免序列化检查警告
        ignoredActions: [
          'persist/PERSIST', 
          'persist/REHYDRATE', 
          'persist/PAUSE',
          'persist/PURGE',
          'persist/REGISTER'
        ],
        // 忽略状态中的非序列化值
        ignoredPaths: ['register', '_persist'],
      },
    }),
  // 开发环境启用 Redux DevTools
  devTools: true,
})

/**
 * 创建持久化存储
 */
export const persistor = persistStore(store)

// 导出 RootState 类型，用于 TypeScript 类型推断
export type RootState = ReturnType<typeof store.getState>

// 导出 AppDispatch 类型，用于 dispatch 的类型推断
export type AppDispatch = typeof store.dispatch

// 导出默认 store 实例
export default store